package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流---传对象--高级流
 * ObjectOutputStream    对象输出流---传Person.java对象---写操作
 * ObjectInputStream     对象输入流---传Person.java对象---读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream  对象输出流
     * 使用方法：1.创建实现序列化接口的对象
     */
    @Test
    public void testOOS() throws IOException, ClassNotFoundException {
        //1.创建Person对象
        Person p=new Person();
        p.setName("寒梅卷");
        //数组--动态数组
        //    String str={"1","2","3"};   静态动态数组
        //    String str=new String[]{"1"};
        p.setSay(new String[]{"百因必有果，你的报应就是我"});
        System.out.println("打印对象："+p.toString());

        //对象输出写文件    xxx.obj    Person.java
        FileOutputStream fos=
                new FileOutputStream("person.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)   ----理解：写出对象
         * 该方法会将给定对象按照其结构进行转换
         * 转换为一组“组”字节，再通过其处理的流写出
         *
         * NotSerializableException 没有序列化异常
         * 原因：写出类没有实现序列化接口
         *
         * 写出文件专业术语
         * 1.通过对象输出流将Person类，先转换为一组“组”字节，
         * 这个过程【对象序列化】
         * 2.将序列化后的字节在通过字节流【低级流】写入文件中
         * 【硬盘上】做长久保存，这个过程【数据持久化】
         */
        @Test
        public void testOOS() throws IOException {
            //1.创建Person对象
            Person p=new Person();
            p.setName("高文杰");
            //数组--动态数组
            //   String[]  str={"1","2","3"}; 静态动态数组
            //   String[]  str=new String[]{"1"}
            p.setSay(new String[]{"我c了这队友诗人啊！"});
            System.out.println("打印对象："+p);

            //对象输出写出文件    xxx.obj  Person.java
            FileOutputStream fos=
                    new FileOutputStream("person.obj");
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            /**
             * writeObject(Object obj)        -----理解：写出对象
             * 该方法会将给定队对象按照其结构进行转换
             * 转换为一组“组”字节，再通过其他处理的流写出
             *
             * NotSerializableException 没有序列化异常
             * 原因；写出类没有实现序列化接口
             *
             * 写出文件专业术语
             * 1.通过对象输出流将Person类，先转换为一组“组”字节，
             *  这个过程【对象序列化】
             * 2.将序列化的字节在通过字节流【低级流】写入文件中
             *  【硬盘上】做长久保存，这个过程【数据持久化】
             *  将person.obj持久化保存到硬盘上
             */
            oos.writeObject(p);
            System.out.println("写出成功了");
        }


        @Test
        public void testOIS(){
            //创建低级流
            FileInputStream fis
                    =new FileInputStream("person.obj");
            //创建高级流--对象读入
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject() 获取对象[反序列化操作：二进制转换为对象】
            System.out.println(ois.readObject());
            System.out.println("反序列化成功！");
        }
    }
}
